﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using Model.Models;
using Persistence;
namespace Services
{
    public class GerenciadorCidade
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        public GerenciadorCidade()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        internal GerenciadorCidade(IUnitOfWork unitOfword)
        {
            this.unitOfWork = unitOfword;
            shared = true;
        }

        public int Inserir(CidadeModel cidadeModel)
        {
            TB_CIDADE cidadeE = new TB_CIDADE();
            Atribuir(cidadeModel, cidadeE);
            unitOfWork.RepositorioCidade.Inserir(cidadeE);
            unitOfWork.Commit(shared);
            return cidadeE.id_cidade;

        }


        public void Editar(CidadeModel cidadeModel)
        {
            TB_CIDADE cidadeE = new TB_CIDADE();
            Atribuir(cidadeModel, cidadeE);
            unitOfWork.RepositorioCidade.Editar(cidadeE);
            unitOfWork.Commit(shared);
        }

        public void Remover(int idCidade)
        {
            unitOfWork.RepositorioCidade.Remover(cidade => cidade.id_cidade.Equals(idCidade));
            unitOfWork.Commit(shared);

        }



        private IQueryable<CidadeModel> GetQuery()
        {
            IQueryable<TB_CIDADE> tb_cidade = unitOfWork.RepositorioCidade.GetQueryable();
            var query = from cidade in tb_cidade
                        orderby (cidade.nome)
                        select new CidadeModel
                        {
                            Id_cidade = cidade.id_cidade,
                            Id_estado = cidade.id_estado,
                            Uf = cidade.uf,
                            Nome = cidade.nome
                        };
            return query;
        }

        public IEnumerable<CidadeModel> ObterTodos()
        {
            return GetQuery();
        }

        public CidadeModel Obter(int idCidade)
        {
            IEnumerable<CidadeModel> cidadeEs = GetQuery().Where(cidadeModel => cidadeModel.Id_cidade.Equals(idCidade));
            return cidadeEs.ElementAtOrDefault(0);
        }

        public IEnumerable<CidadeModel> ObterByEstado(int idEstado)
        {
            return GetQuery().Where(cidade => cidade.Id_estado.Equals(idEstado));
        }



        private void Atribuir(CidadeModel cidadeModel, TB_CIDADE cidadeE)
        {
            cidadeE.id_cidade = cidadeModel.Id_cidade;
            cidadeE.id_estado = cidadeModel.Id_estado;
            cidadeE.uf = cidadeModel.Uf;
            cidadeE.nome = cidadeModel.Nome;
        }
    }
}